/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package PRESENT;

import UTILS.ErrorMessages;
import UTILS.GUIConstant;
import BUS.TinhBUS;
import DTO.TinhDTO;
import UTILS.IDATAGUI;
import UTILS.IInitGUI;
import UTILS.IStateGUI;
import UTILS.ITableGUI;
import java.awt.Window;
import java.awt.event.ActionEvent;
import java.awt.event.FocusEvent;
import java.awt.event.MouseEvent;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.table.DefaultTableModel;
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.PlainDocument;

/**
 *
 * @author HuuTri
 */
public class TinhGUI extends javax.swing.JFrame
                     implements IInitGUI, IStateGUI, IDATAGUI, ITableGUI{
    private TinhGUIState currState;

    /**
     * Creates new form TinhGUI
     */
    public TinhGUI() {
        initComponents();
        initCustom();
    }

    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    //<editor-fold defaultstate="collapsed" desc="implements IInitGUI Interfaces">
    /**
     * Khởi tạo giá trị cho table
     */
    @Override
    public void initTable() {
        tableTinh.setModel(TinhBUS.getTableModel());
    }
    
    /**
     * Khởi tạo các phím tắt
     */
    @Override
    public void initKeyBoards() {
        
    }
    
    /**
     * Khởi tạo giá trị trạng thái
     */
    @Override
    public void initState() {
        setSuspendedState();
    }
    
    @Override
    public void initCustom() {
        initTable();
        initKeyBoards();
        initState();
    }
    //</editor-fold>
    
    //<editor-fold defaultstate="collapsed" desc="implements IStateGUI Interface">
    /**
     * Thiết lập trạng thái của các component nhập liệu
     * @param flag 
     */
    @Override
    public void setEnabledState(boolean flag) {
        txtMaTinh.setEnabled(flag);
        txtTenTinh.setEnabled(flag);
        txtMoTa.setEnabled(flag);
        txtId.setEnabled(flag);
    }
    
    /**
     * Trạng thái tạo mới một record
     */
    @Override
    public void setCreationalState() {
        setEnabledState(true);
        currState = TinhGUIState.CREATIONAL;
        //Thiết lập trạng thái các button
        btnThemMoi.setEnabled(true);
        btnXoaBo.setEnabled(false);
        btnLuuLai.setEnabled(true);     
        btnChon.setEnabled(false);
        //Làm mới các ô nhập liệu
        clearAllField();
        
        //Cập nhật số định danh
        txtId.setText(String.valueOf(TinhBUS.getNewId()));
        
        //Thiết lập focus
        txtTenTinh.requestFocus();
    }
    
    /**
     * Trạng thái mặc định
     */
    @Override
    public void setSuspendedState() {
        setEnabledState(false);
        currState = TinhGUIState.SUSPENDED;
        //Thiết lập trạng thái các button
        btnThemMoi.setEnabled(true);
        btnXoaBo.setEnabled(false);
        btnLuuLai.setEnabled(false);    
        btnChon.setEnabled(false);
    }
    
    /**
     * Trạng thái chọn record
     */
    @Override
    public void setSelectionState() {
        setEnabledState(true);
        currState = TinhGUIState.SELECTION;
        //Thiết lập trạng thái các button
        btnThemMoi.setEnabled(true);
        btnXoaBo.setEnabled(true);
        btnLuuLai.setEnabled(true);       
        btnChon.setEnabled(true);
    }
    
    /**
     * Refresh trạng thái
     */
    @Override
    public void setRefreshState() {
        initTable();
        setSuspendedState();
    }
    //</editor-fold>
    
    //<editor-fold defaultstate="collapsed" desc="implement IDATAGUI Interface">
    @Override
    public boolean insertRecord() {
        if (checkAllField()) { 
            return TinhBUS.insertRecord(txtId.getText(), txtMaTinh.getText(), txtTenTinh.getText(), txtMoTa.getText());
        }
        return false;
    }
    
    @Override
    public boolean deleteRecord() {
        // Lấy row hiện tại đang được chọn.
        int row = tableTinh.getSelectedRow();
        
        if (row >= 0) {
            // Xóa Row của table
            ((DefaultTableModel)tableTinh.getModel()).removeRow(row);
            // Xóa Row tại database
            return TinhBUS.deleteRecord(txtId.getText(),
                    txtMaTinh.getText(), 
                    txtTenTinh.getText(), 
                    txtMoTa.getText());
        }
        return false;
    }
    
    @Override
    public boolean updateRecord() {
        // lấy row hiện tại được chọn
        int row  = tableTinh.getSelectedRow();
        
        if (row >= 0) {
            // Cập nhật row tại table
            sendDataFromFieldToSelectedRecordOfTable();
            // Cập nhật row tại data
            return TinhBUS.updateRecord(txtId.getText(),
                    txtMaTinh.getText(), 
                    txtTenTinh.getText(), 
                    txtMoTa.getText());
        }
        return false;
    }
    //</editor-fold>
    
    //<editor-fold defaultstate="collapsed" desc="implements ITableGUI Interface">
    /**
     * Chuyển thông tin từ các field sang record đang được chọn.
     */
    @Override
    public void sendDataFromFieldToSelectedRecordOfTable() {
        // Lấy thông tin record đang được chọn
        int row = tableTinh.getSelectedRow();
        
        TinhBUS.setValue(tableTinh.getModel(), row, TinhDTO.ID, txtId.getText());
        TinhBUS.setValue(tableTinh.getModel(), row, TinhDTO.MA_TINH, txtMaTinh.getText());
        TinhBUS.setValue(tableTinh.getModel(), row, TinhDTO.TEN_TINH, txtTenTinh.getText());
        TinhBUS.setValue(tableTinh.getModel(), row, TinhDTO.MO_TA, txtMoTa.getText());
    }
    
    /**
     * Chuyển thông tin từ record đang được chọn sang các field
     */
    @Override
    public void sendDataFromSelectedRecordOfTableToField() {
        // Lấy chỉ số cột hiện tại được chọn
        int row = tableTinh.getSelectedRow();
        
        if (row >= 0) {
            txtId.setText(TinhBUS.getValue(tableTinh.getModel(), row, TinhDTO.ID).toString());
            txtMaTinh.setText(TinhBUS.getValue(tableTinh.getModel(), row, TinhDTO.MA_TINH).toString());
            txtTenTinh.setText(TinhBUS.getValue(tableTinh.getModel(), row, TinhDTO.TEN_TINH).toString());
            txtMoTa.setText(TinhBUS.getValue(tableTinh.getModel(), row, TinhDTO.MO_TA).toString());
        }
    }
    
    /**
     * Tạo record mới trong table
     */
    @Override
    public void sendDataFromFieldToNewRecordOfTable() {
        ((DefaultTableModel)tableTinh.getModel()).addRow(new Object[] {
            txtId.getText(),
            txtMaTinh.getText(),
            txtTenTinh.getText(),
            txtMoTa.getText()
        });
        
    }
    //</editor-fold>
    
    //<editor-fold defaultstate="collapsed" desc="Một số hàm public khác">
    /**
     * Lấy giá trị số định danh của tỉnh
     * @return
     */
    public String getMaTinh() {
        return txtMaTinh.getText();
    }
    
    /**
     * Lấy thông tin main panel
     * @return 
     */
    public JPanel getPanel() {
        return panelTinh;
    }
    //</editor-fold>
    
    //<editor-fold defaultstate="collapsed" desc="Kiểm tra đính đúng đắn của các ô nhập liệu">
    private boolean checkAllField() {
        return checkMaTinh() && checkTenTinh();
    }
    
    /**
     * Kiểm tra tinh đúng đắn của mã tỉnh
     * @return
     */
    private boolean checkMaTinh() {
        boolean res = true;
        
        if (txtMaTinh.getText().isEmpty()) {
            // Chuỗi rỗng
            txtMaTinh_Error.setText(ErrorMessages.TINHGUI_TXTMATINH_ERROR_EMPTY);
            res = false;
        } else if (txtMaTinh.getText().length() > GUIConstant.TINH_TXTMATINH_LENGTH_MAX) {
            // Chiều dài của không giống quy định
            txtMaTinh_Error.setText(ErrorMessages.TINHGUI_TXTMATINH_ERROR_LENGTH + GUIConstant.TINH_TXTMATINH_LENGTH_MAX);
            res = false;
        } else if(!TinhBUS.checkMaTinh(txtId.getText(), txtMaTinh.getText())) {
            txtMaTinh_Error.setText(ErrorMessages.TINHGUI_TXTMATINH_ERROR_EXIST);            
            res = false;
        } else {
            txtMaTinh_Error.setText("");
        }
        
        return res;
    }
    
    /**
     * Kiểm tra tính đúng đắn của tên tỉnh
     * @return
     */
    private boolean checkTenTinh() {
        boolean res = true;
        
        if (txtTenTinh.getText().isEmpty()) {
            // Trường hợp tên tỉnh bị bỏ trống
            txtTenTinh_Error.setText(ErrorMessages.TINHGUI_TXTTENTINH_ERROR_EMPTY);
            res = false;
        } else if (txtTenTinh.getText().length() < GUIConstant.TINH_TXTTENTINH_LENGTH_MIN) {
            // Trường hợp tên tỉnh nhỏ hơn số kí tự quy định
            txtTenTinh_Error.setText(ErrorMessages.TINHGUI_TXTTENTINH_ERROR_LENGTH_LESS + GUIConstant.TINH_TXTTENTINH_LENGTH_MIN);
            res = false;
        } else if (txtTenTinh.getText().length() > GUIConstant.TINH_TXTTENTINH_LENGTH_MAX) {
            // Trường hợp tên tỉnh lớn hơn số kí tự cho phép
            txtTenTinh_Error.setText(ErrorMessages.TINHGUI_TXTTENTINH_ERROR_LENGTH_GREATER + GUIConstant.TINH_TXTTENTINH_LENGTH_MAX);
            res = false;
        } else {
            txtTenTinh_Error.setText("");
        }
        
        return res;
    }
    //</editor-fold>
    
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        panelTinh = new javax.swing.JPanel();
        jScrollPane2 = new javax.swing.JScrollPane();
        tableTinh = new org.jdesktop.swingx.JXTable();
        btnChon = new javax.swing.JButton();
        jLabel1 = new javax.swing.JLabel();
        txtMaTinh = new javax.swing.JTextField();
        jLabel2 = new javax.swing.JLabel();
        txtTenTinh = new javax.swing.JTextField();
        jLabel3 = new javax.swing.JLabel();
        jScrollPane3 = new javax.swing.JScrollPane();
        txtMoTa = new org.jdesktop.swingx.JXTextArea();
        btnXoaBo = new javax.swing.JButton();
        btnThemMoi = new javax.swing.JButton();
        btnLuuLai = new javax.swing.JButton();
        txtMaTinh_Error = new javax.swing.JLabel();
        txtTenTinh_Error = new javax.swing.JLabel();
        jLabel4 = new javax.swing.JLabel();
        txtId = new javax.swing.JTextField();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        tableTinh.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {
                {null, null, null, null},
                {null, null, null, null},
                {null, null, null, null},
                {null, null, null, null}
            },
            new String [] {
                "Title 1", "Title 2", "Title 3", "Title 4"
            }
        ));
        tableTinh.setEditable(false);
        tableTinh.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                tableTinhMouseClicked(evt);
            }
        });
        tableTinh.addKeyListener(new java.awt.event.KeyAdapter() {
            public void keyPressed(java.awt.event.KeyEvent evt) {
                tableTinhKeyPressed(evt);
            }
        });
        jScrollPane2.setViewportView(tableTinh);

        btnChon.setText("Chọn");
        btnChon.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnChonActionPerformed(evt);
            }
        });

        jLabel1.setFont(new java.awt.Font("Tahoma", 1, 13)); // NOI18N
        jLabel1.setText("Mã Tỉnh:");

        txtMaTinh.addFocusListener(new java.awt.event.FocusAdapter() {
            public void focusLost(java.awt.event.FocusEvent evt) {
                txtMaTinhFocusLost(evt);
            }
        });
        txtMaTinh.setDocument(new PlainDocument() {
            public void insertString(int offset, String str, AttributeSet attr) throws BadLocationException {
                if (str == null)
                return;

                if ((getLength() + str.length()) <= GUIConstant.TINH_TXTMATINH_LENGTH_MAX) {
                    super.insertString(offset, str, attr);
                } else {
                    txtMaTinh_Error.setText(ErrorMessages.TINHGUI_TXTMATINH_ERROR_LENGTH + GUIConstant.TINH_TXTMATINH_LENGTH_MAX);
                }
            }
        });

        jLabel2.setFont(new java.awt.Font("Tahoma", 1, 13)); // NOI18N
        jLabel2.setText("Tên Tỉnh: ");

        txtTenTinh.addFocusListener(new java.awt.event.FocusAdapter() {
            public void focusLost(java.awt.event.FocusEvent evt) {
                txtTenTinhFocusLost(evt);
            }
        });

        jLabel3.setFont(new java.awt.Font("Tahoma", 1, 13)); // NOI18N
        jLabel3.setText("Mô Tả:");

        txtMoTa.setColumns(20);
        txtMoTa.setRows(5);
        jScrollPane3.setViewportView(txtMoTa);

        btnXoaBo.setText("Xóa Bỏ");
        btnXoaBo.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnXoaBoActionPerformed(evt);
            }
        });

        btnThemMoi.setText("Thêm Mới");
        btnThemMoi.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnThemMoiActionPerformed(evt);
            }
        });

        btnLuuLai.setText("Lưu Lại");
        btnLuuLai.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnLuuLaiActionPerformed(evt);
            }
        });

        txtMaTinh_Error.setForeground(new java.awt.Color(255, 0, 51));

        txtTenTinh_Error.setForeground(new java.awt.Color(255, 0, 51));

        jLabel4.setFont(new java.awt.Font("Tahoma", 1, 13)); // NOI18N
        jLabel4.setText("ID:");

        txtId.setEditable(false);
        txtId.addFocusListener(new java.awt.event.FocusAdapter() {
            public void focusLost(java.awt.event.FocusEvent evt) {
                txtIdFocusLost(evt);
            }
        });
        txtMaTinh.setDocument(new PlainDocument() {
            public void insertString(int offset, String str, AttributeSet attr) throws BadLocationException {
                if (str == null)
                return;

                if ((getLength() + str.length()) <= GUIConstant.TINH_TXTMATINH_LENGTH_MAX) {
                    super.insertString(offset, str, attr);
                } else {
                    txtMaTinh_Error.setText(ErrorMessages.TINHGUI_TXTMATINH_ERROR_LENGTH + GUIConstant.TINH_TXTMATINH_LENGTH_MAX);
                }
            }
        });

        javax.swing.GroupLayout panelTinhLayout = new javax.swing.GroupLayout(panelTinh);
        panelTinh.setLayout(panelTinhLayout);
        panelTinhLayout.setHorizontalGroup(
            panelTinhLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 400, Short.MAX_VALUE)
            .addGroup(panelTinhLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(panelTinhLayout.createSequentialGroup()
                    .addContainerGap()
                    .addGroup(panelTinhLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                        .addComponent(jScrollPane2, javax.swing.GroupLayout.DEFAULT_SIZE, 380, Short.MAX_VALUE)
                        .addGroup(panelTinhLayout.createSequentialGroup()
                            .addComponent(jLabel1, javax.swing.GroupLayout.PREFERRED_SIZE, 54, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                            .addComponent(txtMaTinh, javax.swing.GroupLayout.PREFERRED_SIZE, 42, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                            .addComponent(jLabel2)
                            .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                            .addComponent(txtTenTinh))
                        .addGroup(panelTinhLayout.createSequentialGroup()
                            .addComponent(jLabel3)
                            .addGap(18, 18, 18)
                            .addComponent(jScrollPane3))
                        .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, panelTinhLayout.createSequentialGroup()
                            .addGap(0, 0, Short.MAX_VALUE)
                            .addGroup(panelTinhLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                .addComponent(btnChon, javax.swing.GroupLayout.Alignment.TRAILING)
                                .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, panelTinhLayout.createSequentialGroup()
                                    .addComponent(btnThemMoi)
                                    .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                    .addComponent(btnLuuLai, javax.swing.GroupLayout.PREFERRED_SIZE, 67, javax.swing.GroupLayout.PREFERRED_SIZE)
                                    .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                    .addComponent(btnXoaBo))))
                        .addGroup(panelTinhLayout.createSequentialGroup()
                            .addGroup(panelTinhLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                .addComponent(txtMaTinh_Error)
                                .addComponent(txtTenTinh_Error)
                                .addGroup(panelTinhLayout.createSequentialGroup()
                                    .addComponent(jLabel4, javax.swing.GroupLayout.PREFERRED_SIZE, 54, javax.swing.GroupLayout.PREFERRED_SIZE)
                                    .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                    .addComponent(txtId, javax.swing.GroupLayout.PREFERRED_SIZE, 42, javax.swing.GroupLayout.PREFERRED_SIZE)))
                            .addGap(0, 0, Short.MAX_VALUE)))
                    .addContainerGap()))
        );
        panelTinhLayout.setVerticalGroup(
            panelTinhLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 317, Short.MAX_VALUE)
            .addGroup(panelTinhLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(panelTinhLayout.createSequentialGroup()
                    .addContainerGap()
                    .addGroup(panelTinhLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                        .addComponent(jLabel4)
                        .addComponent(txtId, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                    .addGroup(panelTinhLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                        .addComponent(jLabel1)
                        .addComponent(txtMaTinh, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addComponent(jLabel2)
                        .addComponent(txtTenTinh, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                    .addComponent(txtMaTinh_Error)
                    .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                    .addComponent(txtTenTinh_Error)
                    .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                    .addGroup(panelTinhLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                        .addComponent(jLabel3)
                        .addComponent(jScrollPane3, javax.swing.GroupLayout.PREFERRED_SIZE, 52, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                    .addGroup(panelTinhLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                        .addComponent(btnXoaBo)
                        .addComponent(btnThemMoi)
                        .addComponent(btnLuuLai))
                    .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                    .addComponent(jScrollPane2, javax.swing.GroupLayout.DEFAULT_SIZE, 100, Short.MAX_VALUE)
                    .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                    .addComponent(btnChon)
                    .addContainerGap()))
        );

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(0, 0, 0)
                .addComponent(panelTinh, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addGap(0, 0, 0))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(0, 0, 0)
                .addComponent(panelTinh, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addGap(0, 0, 0))
        );

        pack();
    }// </editor-fold>//GEN-END:initComponents

    private void btnThemMoiActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnThemMoiActionPerformed
        handleBtnThemMoiActionPerformed(evt);
    }//GEN-LAST:event_btnThemMoiActionPerformed

    private void tableTinhMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_tableTinhMouseClicked
        handleTableTinhMouseClicked(evt);
    }//GEN-LAST:event_tableTinhMouseClicked

    private void tableTinhKeyPressed(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_tableTinhKeyPressed
        handleTableTinhMouseClicked(null);
    }//GEN-LAST:event_tableTinhKeyPressed

    private void btnLuuLaiActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnLuuLaiActionPerformed
        handleBtnLuuLaiActionPerformed(evt);
    }//GEN-LAST:event_btnLuuLaiActionPerformed

    private void btnXoaBoActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnXoaBoActionPerformed
        handleBtnXoaBoActionPerformed(evt);
    }//GEN-LAST:event_btnXoaBoActionPerformed

    private void btnChonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnChonActionPerformed
        handleBtnChonActionPerformed(evt);
    }//GEN-LAST:event_btnChonActionPerformed

    private void txtMaTinhFocusLost(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_txtMaTinhFocusLost
        handleTxtMaTinhFocusLost(evt);
    }//GEN-LAST:event_txtMaTinhFocusLost

    private void txtTenTinhFocusLost(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_txtTenTinhFocusLost
        handleTxtTenTinhFocusLost(evt);
    }//GEN-LAST:event_txtTenTinhFocusLost

    private void txtIdFocusLost(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_txtIdFocusLost
        // TODO add your handling code here:
    }//GEN-LAST:event_txtIdFocusLost

    //<editor-fold defaultstate="collapsed" desc="Handle Event">
    
    /**
     * Hàm thực thi sử lí sự kiện lost focus của tên tỉnh
     * @param evt 
     */
    private void handleTxtTenTinhFocusLost(FocusEvent evt) {
        checkTenTinh();
        txtMaTinh.setText(TinhBUS.getMaTinhFromTenTinh(txtTenTinh.getText()));
    }
    
    /**
     * Hàm thực thi xử lí sự kiện lost focus của Mã tỉnh
     * @param evt 
     */
    private void handleTxtMaTinhFocusLost(FocusEvent evt) {
        checkMaTinh();
    }
    
    /**
     * Hàm thực thi xử lí sự kiện btn chọn được ấn
     * @param evt
     */
    private void handleBtnChonActionPerformed(ActionEvent evt) {
        Window win = SwingUtilities.getWindowAncestor(getPanel());
        if (win != null) {
            win.dispose();
        }
    }
    
    /**
     * Hàm thực thi xử lí sự kiện chọn button lưu lại
     * @param evt
     */
    private void handleBtnLuuLaiActionPerformed(ActionEvent evt) {
        if (checkAllField()) {
            if (currState == TinhGUIState.CREATIONAL) {
                insertRecord();
                sendDataFromFieldToNewRecordOfTable();
                setCreationalState();
            } else if (currState == TinhGUIState.SELECTION) {
                updateRecord();
            }
        }
    }
    
    /**
     * Hàm thực thi xử lí sự kiện button xóa bỏ
     * @param evt
     */
    private void handleBtnXoaBoActionPerformed(ActionEvent evt) {
        if (currState == TinhGUIState.SELECTION) {
            deleteRecord();
            setCreationalState();
        }
    }
    
    /**
     * Xử lí sự kiện table được click vào
     * @param evt
     */
    private void handleTableTinhMouseClicked(MouseEvent evt) {
        // Thiết lập trạng thái record được chọn
        setSelectionState();
        // Chuyển dữ liệu từ record được chọn đến với các textfield được chọn
        sendDataFromSelectedRecordOfTableToField();
    }
    
    /**
     * Xử lý sự kiện click btnThemMoi
     * @param evt
     */
    private void handleBtnThemMoiActionPerformed(ActionEvent evt) {
        // Thiết lập trạng thái tạo mới
        setCreationalState();
    }
    //</editor-fold>
   
    private void clearAllField() {
        txtMaTinh.setText("");
        txtTenTinh.setText("");
        txtMoTa.setText("");
    }
    
    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        /* Set the Nimbus look and feel */
        //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
        /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
         * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html 
         */
        try {
            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (ClassNotFoundException ex) {
            java.util.logging.Logger.getLogger(TinhGUI.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
            java.util.logging.Logger.getLogger(TinhGUI.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            java.util.logging.Logger.getLogger(TinhGUI.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (javax.swing.UnsupportedLookAndFeelException ex) {
            java.util.logging.Logger.getLogger(TinhGUI.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }
        //</editor-fold>

        /* Create and display the form */
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new TinhGUI().setVisible(true);
            }
        });
    }
    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JButton btnChon;
    private javax.swing.JButton btnLuuLai;
    private javax.swing.JButton btnThemMoi;
    private javax.swing.JButton btnXoaBo;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JLabel jLabel3;
    private javax.swing.JLabel jLabel4;
    private javax.swing.JScrollPane jScrollPane2;
    private javax.swing.JScrollPane jScrollPane3;
    private javax.swing.JPanel panelTinh;
    private org.jdesktop.swingx.JXTable tableTinh;
    private javax.swing.JTextField txtId;
    private javax.swing.JTextField txtMaTinh;
    private javax.swing.JLabel txtMaTinh_Error;
    private org.jdesktop.swingx.JXTextArea txtMoTa;
    private javax.swing.JTextField txtTenTinh;
    private javax.swing.JLabel txtTenTinh_Error;
    // End of variables declaration//GEN-END:variables



}
enum TinhGUIState {
    CREATIONAL,
    SUSPENDED,
    SELECTION
}
